<?php
/**
* 定义采集器类
*/

class picker{
	#定义采集器基本变量
	public $wpPdo;

	/**
	* 构造函数，处理预包含和实例化的问题
	*/
	public function __construct(){
		require_once('common_word.php');
		$this->wpPdo = new wp_pdo();
		#与common_word中声明有关系
		$this->wpPdo = $this->wpPdo->wpPdo;
	}


	/**
	* @name   which_picker 从数据库查询采集器
	* @param  int pkId 数据库中采集器的id
	* @return array thePicker 采集器规则
	*/
	public function which_picker( $pkId = 0 ){

		if( 0 == $pkId ){
			echo "采集器编号有误";
			return false;
		}else{
			@$thePicker = $this->wpPdo->getInfoById( 'wp_picker' , $pkId );
		}

		return $thePicker;
	}

	/**
	* @name   get_list_url    获取当前要处理的列表页的url
	* @param  int     pnum    页码数
	* @param  string  list    列表页地址
	* @return string  relList 实际要处理的页面 
	*/
	public function get_list_url ( $pnum = 0 , $list = '' ){
		if( '' == $list || strlen( $list ) == 0  ){
			#如果列表页链接为空，则返回失败
			return false;
		}elseif( 0 == substr_count( $list, '[*]' ) ){
			#如果链接中，没有页面标记‘[*]’，说明页面没有分页，直接返回当前页面
			return $list;
		}else{
			#如果列表页分页，则处理后返回
			return str_replace( '[*]' , $pnum , $list );
		}
	}

	/**
	* @name   get_article_url   获取文章页面的地址
	* @param  string lstUrl     列表页的url
	* @param  string lstPageUrl 列表页内文章的链接正则表达式
	* @param  string hostUrl    所采集网站的域名
	* @return array  pageUrlArr 文章页链接数组
	*/
	public function get_article_url( $lstUrl = '' , $lstPageUrl = '' , $hostUrl = '' ){

	}

	/**
	* @name   checkFormValid 检测表单填写是否有误
	* @param  array  theForm
	* @return boolean
	* @todo   兼顾不同表单通用的检验
	*/
	public function checkFormValid( $theForm = array() ){
		if( empty( $theForm ) ){
			echo "表单填写有误";
			return false;
		}

		foreach ($theForm as $fKey => $fValue) {
			if( !isset( $theForm[$fKey] ) ){
				echo $fKey . "是空的<br>";
				return false;
			}
		}
		return true;
	}

	/**
	* @name   getPageCttByCurl  通过curl获取页面内容
	* @param  string url  将要采集页面的链接
	* @return string page 获取的页面内容
	*/
	public function getPageCttByCurl( $url = '' ){

		$ch = curl_init();

		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HEADER, 0);

		$page = curl_exec($ch);
		curl_close($ch);
		unset($ch);

		#对页面的编码进行转化
		$p_charset = '/charset=([a-zA-z0-9\-]*)/i';
		preg_match($p_charset, $page, $charset);
		if(!$charset[1]){
			$charset[1] = 'gbk';
		}

		$page = mb_convert_encoding($page, 'utf-8', $charset[1]);

		return $page;
	}

	/**
	* @name   getPickerRule  获取所选采集器的规则
	* @param  string  pageId
	* @return int     id
	*/
	public function getPickerRule( $pageId = '' ){
		@$tmp = $this->getPickerId( $pageId );
		$pgRule = $this->wpPdo->query( "SELECT * FROM wp_picker WHERE id=$tmp" , PDO::FETCH_ASSOC );

		return $pgRule->fetchAll()[0];
	}

	/**
	* @name   getPickerId   获取采集器的编号
	* @param  string  pkerStr
	* @return int     pickerId
	*/
	public function getPickerId( $pkerStr = '' ){
		$pickerId = explode( '_' , $pkerStr );
		return $pickerId[1];
	}


	/**
	* @name   getLstPageArtUrl  获取列表页面文章的url
	* @param  string  thePage   采集到的页面
	* @param  string  lnkRule   链接正则表达式
	* @param  string  hstDomn   目标网站的域名
	* @return array   artLnkArr 返回采集到的文章链接数组
	*/
	public function getLstPageArtUrl( $thePage = '' , $lnkRule = '' , $hstDomn = '' ){

		#判断参数有效性
		if( strlen( $thePage ) && strlen( $lnkRule ) && strlen( $hstDomn ) ){
			#抓取列表版块
			preg_match( $lnkRule , $thePage , $urls );

			$pttHttp   = '/(https?:\/\/)?[\w\d.\/]*.s?html?/i';
			$pttHttp_1 = '/href=\"([\w\s\W\S]+?)\"/';
			preg_match_all( $pttHttp_1 , $urls[1] , $urlArr);

			#判断每一个链接，是绝对路径，还是相对路径，如果是相对路径，则转变为绝对路径
			$artLnkArr = array();

			foreach ($urlArr[1] as $url) {
				if( '#' == $url ){
					continue;
				}elseif( !substr_count( $url , 'http' ) ){
					#如果是相对地址，要判断是不是以‘/’开头，如果不是，在拼接时，要加上
					if( '/' == $url[0] ){
						$artLnkArr[] = $hstDomn . $url;
					}else{
						$artLnkArr[] = $hstDomn . '/' . $url;
					}
					
				}else{
					$artLnkArr[] = $url;
				}
			}

			#对结果去重
			return array_unique( $artLnkArr );

		}else{
			#传入参数有误
			echo '<br>传入参数有误@function:' . __FUNCTION__ . " in file:" . __FILE__ . " line :" . __LINE__ . "<br>";
			return false;
		}
	}

	/**
	* @name   getArtPgInfo  获取文章页面内容：标题和内容
	* @param  string  artPgLnk  当前文章页面链接
	* @param  string  ttlRule   标题匹配规则
	* @param  string  cttRule   内容匹配规则
	* @return array   artCttArr 文章内容数组
	*/
	public function getArtPgInfo( $artPgLnk = '' , $ttlRule = '' , $cttRule = '' ){
		#获取当前文章页的内容
		$theArticle = $this->getPageCttByCurl( $artPgLnk );
		#获取文章页标题
		$theTtl = $this->getArtPgTll( $ttlRule , $theArticle );
		#获取文章页内容
		$theCtt = $this->getArtPgCtt( $cttRule , $theArticle );

		return array( $theTtl , $theCtt );
	}

	/**
	* @name   getArtPgTll      获取文章的标题
	* @param  string  ttlRule  标题的匹配规则
	* @param  string  curPage  当前页面的内容
	* @return string  artTtl   返回文章标题
	*/
	public function getArtPgTll( $ttlRule = '' , $curPage = '' ){
		#匹配文章标题
		preg_match( $ttlRule , $curPage , $artTtl );
		return $artTtl[1];
	}

	/**
	* @name   getArtPgCtt      获取文章页的内容
	* @param  string  cttRule  内容的匹配规则
	* @param  string  curPage  当前页面的内容
	* @return string  artCtt   返回文章内容
	*/
	public function getArtPgCtt( $cttRule = '' , $curPage = '' ){
		#匹配文章内容
		preg_match( $cttRule , $curPage , $artCtt );
		return $artCtt[1];
	}

	/**
	* @name   getTags  获取文章的标签
	* @param  string  title  文章标题
	* @param  string  content 文章内容
	* @return array   tags
	*/
	public function getTags( $title = '' , $content = "" ){
		######等待实现######
		return array('tag');
	}

	/**
	* @name   getKeywords  获取文章的关键词
	* @param  string  title   标题
	* @param  string  content 内容
	* @return array   keywords
	*/
	public function getKeywords( $title = '' , $content = "" ){
		######等待实现######
		return array('keyword');
	}

	/**
	* @name   is_picked_by_url   判断是否已经采集过
	* @param  string  url
	* @return boolean
	*/
	public function is_picked_by_url( $url = '' ){

		$isRepeat = $this->wpPdo->prepare( 'SELECT id FROM wp_article WHERE url = ?' );
		$isRepeat->execute( array( $url ) );
		$id = $isRepeat->fetchAll();

		if( $id[0]['id'] > 0 ){
			echo "已经采集<br>";
			return true;
		}else{
			return false;
		}
	}

	/**
	* @name   optimArtStr   优化字符串，去掉字符串中的基本html，前后空白字符等
	* @param  string  document
	* @return string  optimStr
	*/
	public function optimArtStr( $document = '' ){
		if( is_string($document) && mb_strlen($document) ){
			$document = trim( strip_tags( $document ) );
			#去除掉采集后文中残留的&nbsp;等符号
			preg_replace( '/\&[a-zA-z]+?\;/i' , '' , $document);
			return preg_replace( '/\s/', '', $document);
		}else{
			return false;
		}
	}


}